上次提到了類別(class)與模組(module)的差異,今天針對module如何引入進class使用來特別說明。
比較 | 模組(module) | 類別(class) |
---|---|---|
繼承inheritance | ✕ | ✔ |
可實體化instantiation | ✕ | ✔ |
加入模組進入類別使用的時候,一般最常見的就是include
,延續之前的例子:
module VolleyTeam
def set
puts '舉球'
end
end
class BasketTeam
include VolleyTeam #將module include到類別裡
def pass
puts '接球後,傳球!'
end
end
sakuragi = BasketTeam.new #產生sakaragi實體
sakuragi.pass # => 接球後,傳球!
sakuragi.set # => 舉球! #module的實體方法
當一個 class 使用 include
引入 Module 的時候,會將module內的方法在class內增加一個實體方法。
如果使用extend加入module模組的話:
module VolleyTeam
def set
puts '舉球'
end
end
class BasketTeam
extend VolleyTeam
def pass
puts '接球後,傳球!'
end
end
sakuragi = BasketTeam.new
sakuragi.pass # => 接球後,傳球!
sakuragi.set # => 舉球!
會出現error
undefined method `set' for #<BasketTeam:0x00007fc18783eca8>
原因是如果用extend的話,會將module內的方法在class增加為類別方法,所以用實體後面去接類別方法,就會出現錯誤。
因此直接改為類別直接接類別方法就好:
sakuragi = BasketTeam.new
sakuragi.pass # => 接球後,傳球!
BasketTeam.set # => 舉球! #module的類別方法,直接接BasketTeam類別
Include is for adding methods to an instance of a class and extend is for adding class methods.
使用include
引入,會將module內的方法在class增加為實體方法。
使用extend
引入,會將module內的方法在class增加為類別方法。
參考資料:
What is the different between <> and <> in use case diagram?
https://medium.com/@leo_hetsch/ruby-modules-include-vs-prepend-vs-extend-f09837a5b073
Include vs Extend in Ruby
Ruby 的繼承鍊 (2) - Module 的 include、prepend 和 extend
“Ninety percent of all those who fail are not actually defeated. They simply quit.”
— Paul J. Meyer, Motivational Coach
本文同步發佈於: https://louiswuyj.tw/